package pwd.allen.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusPropertiesCustomizer;
import com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler;
import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
import com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import pwd.allen.handler.MyMetaObjectHandler;
import pwd.allen.injector.MySqlInjector;
import pwd.allen.util.MyIdGenerator;

/**
 * @author 门那粒沙
 * @create 2020-06-21 12:57
 **/
@Configuration
public class MPConfig {

    //<editor-fold desc="分页插件配置，不加的话selectPage等分页方法没有分页效果">
    /**
     * 旧版本是PaginationInterceptor
     * 新版本是MybatisPlusInterceptor
     */
//    @Bean
//    public PaginationInnerInterceptor paginationInterceptor() {
//        PaginationInnerInterceptor interceptor = new PaginationInnerInterceptor();
//
//        // 设置请求的页面大于最大页后操作， true调回到首页，false 继续请求  默认false
//        interceptor.setOverflow(false);
//        // 设置最大单页限制数量，新版是setLimit()，默认500条-1不受限制；新版为setMaxLimit，默认不限制
//        interceptor.setMaxLimit(500L);
//        // 开启 count 的 join 优化,只针对部分 left join
//        interceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
//        return interceptor;
//    }

    /**
     * 新版分页插件
     * 只需加入spring容器中即可被自动装配
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 对于单一数据库类型来说,都建议配置该值,避免每次分页都去抓取数据库类型
//        paginationInnerInterceptor.setDbType(DbType.ORACLE_12C);
        // 设置请求的页面大于最大页后操作， true调回到首页，false 继续请求  默认false
        paginationInnerInterceptor.setOverflow(false);
        // 设置最大单页限制数量，新版是setLimit()，默认500条-1不受限制；新版为setMaxLimit，默认不限制
//        interceptor.setMaxLimit(500L);
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
    //</editor-fold>

    /**
     * 配置MybatisCofiguration
     * @see com.baomidou.mybatisplus.core.MybatisConfiguration
     * @return
     */
    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> {
            configuration.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
//            configuration.setUseDeprecatedExecutor(false);
        };
    }

    /**
     * 自定义mybatisplus配置
     * spring boot的话可以直接注入容器中即可
     * @return
     */
    @Bean
    public MybatisPlusPropertiesCustomizer plusPropertiesCustomizer() {
        // 使用MybatisPlusPropertiesCustomizer
        return plusProperties -> {
            // 自定义ID生成器
            plusProperties.getGlobalConfig().setIdentifierGenerator(new MyIdGenerator());
            plusProperties.getGlobalConfig().setSqlInjector(new MySqlInjector());
        };
    }


    /**
     * 自定义公共字段填充处理器
     * @return
     */
    @Bean
    public MyMetaObjectHandler myMetaObjectHandler() {
        return new MyMetaObjectHandler();
    }

    /**
     * 配置oracle主键生成器
     * @return
     */
//    @Bean
    public IKeyGenerator keyGenerator() {
        return new OracleKeyGenerator();
    }


    /**
     *  sql性能分析插件，输出sql语句及所需时间
     * 注意：mybatis plus 3.1.2以上版本不支持该插件，请使用p6spy，具体内容参考官网：https://mp.baomidou.com/guide/p6spy.html
     * @return
     */
//    @Bean
//    @Profile({"dev","test","sit","uat"})
//    public PerformanceInterceptor performanceInterceptor() {
//        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
//        /** SQL 执行性能分析，开发环境使用，线上不推荐。 maxTime 指的是 sql 最大执行时长 */
//        performanceInterceptor.setMaxTime(5000);
//        /** SQL是否格式化 默认false */
//        performanceInterceptor.setFormat(true);
//        return performanceInterceptor;
//    }
}
